package com.vlyman.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 类描述：
 *  swagger文档拦截器
 * @author chenjs
 * @date 2018/10/14 12:01
 **/
@Component
@Slf4j
public class SwaggerInterceptor implements HandlerInterceptor{

    private static final String SWAGGER_AUTH = "swagger_auth";
    @Value("${swagger.password:vlyman}")
    private String swaggerPwd;

    /**
     * 方法描述：
     *   该方法将在请求处理之前进行调用，只有该方法返回true，才会继续执行后续的Interceptor和Controller，
     *   当返回值为true 时就会继续调用下一个Interceptor的preHandle方法，
     *   如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法；
     *  @author chenjs
     *  @date 2018/10/14 15:01
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Cookie[] cookies = request.getCookies();
        if (cookies == null) {
            response.sendRedirect("static/html/document_login.html");
            return false;
        }
        boolean hasAuth = false;
        for (Cookie cookie : cookies) {
            if (SWAGGER_AUTH.equals(cookie.getName())) {
                if (DigestUtils.md5Hex(swaggerPwd).equals(cookie.getValue())) {
                    hasAuth = true;
                } else {
                    Cookie failCookie = new Cookie(SWAGGER_AUTH, "fail");
                    cookie.setPath("/");
                    response.addCookie(failCookie);
                }
            }
        }
        if (!hasAuth) {
            log.info("swagger-尚未认证或认证失败！");
            response.sendRedirect("static/html/document_login.html");
        }
        return hasAuth;
    }

    /**
     * 方法描述：
     *   在业务处理器处理请求执行完成后，生成视图之前执行后处理（调用了Service并返回ModelAndView，但未进行页面渲染），
     *   有机会修改ModelAndView
     *  @author chenjs
     *  @date 2018/10/14 15:02
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 方法描述：
     *   在DispatcherServlet完全处理完请求后被调用，可用于清理资源等。返回处理（已经渲染了页面）
     *  @author chenjs
     *  @date 2018/10/14 15:03
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
